
#include "mt6816_msp_init.h"

SPI_HandleTypeDef SPI1Handle;

void mt6816_gpio_init()
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOA_CLK_ENABLE();

    GPIO_InitStruct.Pin   = GPIO_PIN_4; // SPI1 CS
    GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull  = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin   = GPIO_PIN_5; // SPI1 SCK
    GPIO_InitStruct.Mode  = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull  = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin   = GPIO_PIN_7; // SPI1 MOSI
    GPIO_InitStruct.Mode  = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull  = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin   = GPIO_PIN_6; // SPI1 MISO
    GPIO_InitStruct.Mode  = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull  = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void mt6816_spi_init()
{
    __HAL_RCC_SPI1_CLK_ENABLE();

    SPI1Handle.Instance = SPI1;
    SPI1Handle.Init.Mode = SPI_MODE_MASTER;
    SPI1Handle.Init.Direction = SPI_DIRECTION_2LINES;
    SPI1Handle.Init.DataSize = SPI_DATASIZE_16BIT;
    SPI1Handle.Init.CLKPolarity = SPI_POLARITY_HIGH;
    SPI1Handle.Init.CLKPhase = SPI_PHASE_2EDGE;
    SPI1Handle.Init.NSS = SPI_NSS_SOFT;
    SPI1Handle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
    SPI1Handle.Init.FirstBit = SPI_FIRSTBIT_MSB;
    SPI1Handle.Init.TIMode = SPI_TIMODE_DISABLE;
    SPI1Handle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    SPI1Handle.Init.CRCPolynomial = 10;
    if (HAL_SPI_Init(&SPI1Handle) != HAL_OK)
    {
        Error_Handler();
    }
}

void mt6816_msp_init()
{
    mt6816_gpio_init();
    mt6816_spi_init();
}

static void Error_Handler()
{
    while (1)
    {

    }
}

/*******************************************
 *            MT6816 MSP TEST
 ******************************************/

void mt6816_test_gpio_init()
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOA_CLK_ENABLE();

    GPIO_InitStruct.Pin   = GPIO_PIN_4; // SPI1 CS
    GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull  = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin   = GPIO_PIN_5; // SPI1 SCK
    GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull  = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin   = GPIO_PIN_7; // SPI1 MOSI
    GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull  = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin   = GPIO_PIN_6; // SPI1 MISO
    GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull  = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void mt6816_test_gpio()
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
    HAL_Delay(20);

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
    HAL_Delay(20);
}

void mt6816_test_spi()
{
    unsigned char data = 0x80;
    HAL_SPI_Transmit(&SPI1Handle, &data, 1, HAL_MAX_DELAY);
}
